# 序列类型（容器类型）：存储多个元素，每个元素都可以是任意的数据类型
# 基本数据类型：整数、浮点数、布尔类型

# 问题：为什么要有序列类型？

# 需求：新生开学，将班上同学的姓名都保存下来
# 45个同学 → 45个变量
student_1 = "小柳"
student_2 = "小涂"
student_1 = "小柳"
# 缺点：1. 变量名比较多 2.查找变量也比较困难

# 思考：45个同学都存储在 一个班级名称下，通过编号（学号）去查找某位同学

# 一、01_列表：
# 一个有序、可变的序列类型

# （1）创建一个列表：列表名 = []
# 创建大数据2401班级列表：
bigdata_2401 = ["小柳","小涂"]
numbers = [1,2,3,4,5]
xiaoliu_infor = [2024456010124,"小柳",178.6,["湖北省","黄石市","文理学院"]]
# 以上体现的是列表可以存储多个元素

# （2）列表有序的体现：
# 索引：元素在列表中的先后顺序
# （2.1）正索引从0开始，"小柳"是第一个元素，正索引为0
# （2.2）负索引从-1开始，"小涂"是最后一个元素，负索引为-1

# 思考：要查找列表中某一个元素的值，如何查找？
# 通过索引查询对于索引位置上的元素的值
# 查找某一个元素：列表名[索引]

bigdata_2401 = ["小柳","小涂"]
# 找到小涂：
print(f"索引为1的元素：{bigdata_2401[1]}")

# 思考：如果一个列表中有45个元素，找到最后一个元素？
# 可以通过负索引：bigdata_2401[-1]
print(f"索引为-1的元素：{bigdata_2401[-1]}")

# 思考：一个列表中的某个元素是列表，如果找到这个子列表中的某个元素值
xiaoliu_infor = [["湖北省","黄石市","文理学院"]]
print(xiaoliu_infor[0][1])

# （3）列表可变的体现：
# 列表中的元素的值是可以修改的
bigdata_2401 = ["小柳","小涂"]
print("修改前的列表：",bigdata_2401)
print("修改前的列表的引用地址：",id(bigdata_2401))
# 修改列表中元素的值：列表名[索引] = 新的元素值
bigdata_2401[1] = "小x"
print("修改后的列表:",bigdata_2401)
print("修改后的列表的引用地址:",id(bigdata_2401))

# 思考：修改列表中的元素，列表的引用地址发生改变没有？
# 结论1：修改列表中的元素，列表的引用地址不变

# 思考：什么时候列表的引用地址发生改变？
# 给列表重新赋值
bigdata_2401 = ["小李","小王"]
print("重新赋值后的列表的引用地址:",id(bigdata_2401))
# 结论2：给列表重新赋值，会使列表的引用地址发生改变

# 思考：给列表赋值一个相同元素的列表，引用地址发生改变没？
bigdata_2401 = ["小柳","小涂"]
print("修改前的列表的引用地址：",id(bigdata_2401))
bigdata_2401 = ["小柳","小涂"]
print("重新赋值后的列表的引用地址:",id(bigdata_2401))

# 结论：
# 1. 列表中的元素的值是可以修改的
# 2. 修改列表中的元素，列表的引用地址不变
# 3. 给列表重新赋值，会使列表的引用地址发生改变